#ifndef _WX_SPINBUTT_H_BASE_
#define _WX_SPINBUTT_H_BASE_

// ----------------------------------------------------------------------------
// headers
// ----------------------------------------------------------------------------

#include "wx/defs.h"

#if wxUSE_SPINBTN

#include "wx/control.h"
#include "wx/event.h"

#define wxSPIN_BUTTON_NAME wxT("wxSpinButton")

class wxSpinButtonBase : public wxControl {
  public:
    // ctor initializes the range with the default (0..100) values
    wxSpinButtonBase() { m_min = 0; m_max = 100; }

    // accessors
    virtual int GetValue() const = 0;
    virtual int GetMin() const { return m_min; }
    virtual int GetMax() const { return m_max; }

    // operations
    virtual void SetValue( int val ) = 0;
    virtual void SetMin( int minVal ) { SetRange( minVal, m_max ) ; }
    virtual void SetMax( int maxVal ) { SetRange( m_min, maxVal ) ; }
    virtual void SetRange( int minVal, int maxVal ) {
      m_min = minVal;
      m_max = maxVal;
    }

    // is this spin button vertically oriented?
    bool IsVertical() const { return ( m_windowStyle & wxSP_VERTICAL ) != 0; }

  protected:
    // the range value
    int   m_min;
    int   m_max;

    DECLARE_NO_COPY_CLASS( wxSpinButtonBase )
};

// ----------------------------------------------------------------------------
// include the declaration of the real class
// ----------------------------------------------------------------------------

#include "wx/gtk/spinbutt.h"

// ----------------------------------------------------------------------------
// the wxSpinButton event
// ----------------------------------------------------------------------------

class wxSpinEvent : public wxNotifyEvent {
  public:
    wxSpinEvent( wxEventType commandType = wxEVT_NULL, int winid = 0 )
      : wxNotifyEvent( commandType, winid ) {
    }

    // get the current value of the control
    int GetPosition() const { return m_commandInt; }
    void SetPosition( int pos ) { m_commandInt = pos; }

  private:
    DECLARE_DYNAMIC_CLASS_NO_COPY( wxSpinEvent )
};

typedef void ( wxEvtHandler::*wxSpinEventFunction )( wxSpinEvent& );

#define wxSpinEventHandler(func) \
  (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxSpinEventFunction, &func)

// macros for handling spin events
#define EVT_SPIN_UP(winid, func) \
  wx__DECLARE_EVT1(wxEVT_SCROLL_LINEUP, winid, wxSpinEventHandler(func))
#define EVT_SPIN_DOWN(winid, func) \
  wx__DECLARE_EVT1(wxEVT_SCROLL_LINEDOWN, winid, wxSpinEventHandler(func))
#define EVT_SPIN(winid, func) \
  wx__DECLARE_EVT1(wxEVT_SCROLL_THUMBTRACK, winid, wxSpinEventHandler(func))

#endif // wxUSE_SPINBTN

#endif
// _WX_SPINBUTT_H_BASE_
